package me.lxw.blogsystem.servlet.admin;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import me.lxw.blogsystem.dao.ArticleDAO;
import me.lxw.blogsystem.domain.Article;
import me.lxw.blogsystem.domain.Category;
import me.lxw.blogsystem.domain.Page;
import me.lxw.blogsystem.utils.EncryptUtils;

@WebServlet("/admin/articleAdd.do")
public class ArticleAddServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 得到上传文件的保存目录，将上传的文件放在webRoot目录下（但是一般为了安全放在WEB-INF目录下，不允许外界直接访问，保证上传的安全）
        String path = this.getServletContext().getRealPath("/uploads/cover");
        File file = new File(path);
        // 判断上传文件的保存目录是否存在
        if (!file.exists() && !file.isDirectory()) {
            System.out.println(path + "目录不存在，需要创建！");
            // 创建目录
            file.mkdir();
        }
        try {
            // 使用Apache文件上传组件处理文件上传步骤：
            // 1.创建一个DiskFileItemFactory工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // 2.创建一个文件上传解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
            // 解决中文乱码
            upload.setHeaderEncoding("UTF-8");
            // 3.判断提交的数据普通表单的数据还是带文件上传的表单
            if (!upload.isMultipartContent(request)) {
                // 如果是表单数据普通表单,则按照传统方式获取数据
                return;
            }
            // 4.使用ServletFileUpload解析器解析上传数据，解析结果返回的是一个List<FileItem>集合，每一个FileItem对应一个Form表单的输入项
            List<FileItem> list = upload.parseRequest(request);

            // 定义一个文章对象
            Article article = new Article();
            for (FileItem item : list) {
                // 如果fileItem中封装的是普通输入项的数据
                if (item.isFormField()) {
                    // 获取字段名字
                    String name = item.getFieldName();
                    // 解决普通输入项中中文乱码问题
                    String value = item.getString("UTF-8");

                    System.out.println(name + " = " + value);

                    // 获取参数方式方式发生变化
                    if ("title".equals(name)) {
                        article.setTitle(value);
                    }
                    if ("author".equals(name)) {
                        article.setAuthor(value);;
                    }
                    if ("categoryId".equals(name)) {
                        article.setCategoryId(Integer.valueOf(value));;
                    }
                    if ("description".equals(name)) {
                        article.setDescription(value);
                    }
                    if ("id".equals(name)) {
                        try {
                            article.setId(Integer.valueOf(value));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if ("content".equals(name)) {
                        article.setContent(value);
                    }
                    if ("coverImg2".equals(name)) {
                        article.setCoverImg(value);
                    }
                } else { // 如果表单中提交的是上传文件
                    // 获得上传的文件名称
                    String filename = item.getName();
                    if (filename != null && filename.length() > 0 && filename.indexOf(".") > 0) {
                        // 获取文件后缀名
                        String suffix = filename.substring(filename.lastIndexOf("."), filename.length());

                        if (filename == null || filename.trim().equals(" ")) {
                            continue;
                        }
                        // 注意：不同的浏览器提交的文件名称是不一样的，有些浏览器提交的文件会带有路径，如“D:\\project\WebRoot\hello.jsp”，有一些是单纯的文件名：hello.jsp
                        // 去掉获取到文件名中的路径名，保留单纯的文件名
                        filename = filename.substring(filename.lastIndexOf("\\") + 1);
                        filename = EncryptUtils.md5(filename + new Date().getTime()) + suffix;

                        String coverImg = "uploads/cover/" + filename;
                        article.setCoverImg(coverImg);

                        // 获取item中的上传文件的输入流
                        InputStream in = item.getInputStream();
                        // 创建一个文件输入流
                        FileOutputStream out = new FileOutputStream(path + "\\" + filename);
                        // 创建一个缓冲区
                        byte buffer[] = new byte[1024];
                        // 判断输入流中的数据是否已经读取完毕的标志位
                        int len = 0;
                        // 循环将输入流读入到缓冲区当中，（len = in.read(buffer)>0）就表示in里面还有数据存在
                        while ((len = in.read(buffer)) > 0) {
                            // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录（path+"\\"+filename）当中
                            out.write(buffer, 0, len);
                        }
                        // 关闭输入流
                        in.close();
                        // 关闭输出流
                        out.close();
                        // 删除处理文件上传生成的临时文件
                        item.delete();
                    }
                }
            }
            // 插入数据库
            // 实例化 ArticleDAO
            ArticleDAO articleDAO = new ArticleDAO();
            articleDAO.add(article);

        } catch (Exception e) {
            e.printStackTrace();
        }
        response.sendRedirect("articleList.do");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String idStr = request.getParameter("id");

        int id = -1;
        if (idStr != null) {
            try {
                id = Integer.valueOf(idStr);
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }

        // 实例化 ArticleDAO
        ArticleDAO articleDAO = new ArticleDAO();

        try {
            Article article = articleDAO.findById(id);
            if (article == null)
                article = new Article();

            // 查询所有的分类
            List<Category> list = articleDAO.findAllCategory();
            request.setAttribute("categoryList", list);

            // 搜索参数回传
            request.setAttribute("acticle", article);
            request.setAttribute("categoryId", article.getCategoryId());

            // 跳转到articleList.jsp
            request.getRequestDispatcher("/admin/articleAdd.jsp").forward(request, response);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}